/*
 * Byte.cpp
 *
 *  Created on: 07/06/2014
 *      Author: manuel
 */

#include "Byte.h"

Byte::Byte() : posicion(0) , lleno(false) {
	bits.reset();
}

Byte::Byte(std::string bits_ini) : bits(bits_ini) , posicion(0), lleno(false){
}

Byte::~Byte() {}

bool Byte::cargarDesde(std::fstream& archivo) {
	unsigned char byte;

	archivo.read((char*)&byte, 1);

	std::bitset<8> aux( byte );

	bits.reset();
	bits|=aux;
	lleno = true;
	posicion = 8;

	printf("byte leido: %c, %d\n", byte, (int)bits.to_ulong());

	if (archivo.fail()) {
		archivo.clear();
		return false;
	}
	return true;
}

bool Byte::escribirEn(std::fstream& archivo) {
	unsigned char byte = (unsigned char) bits.to_ulong();

	archivo.write((char*) &byte, 1);
	archivo.flush();

	if (archivo.fail()) {
		archivo.clear();
		return false;
	}
	return true;
}

void Byte::resetear() {
	bits.reset();
	posicion = 0;
	lleno = false;
}

int Byte::bitsLibres() {
	return 8-posicion;
}

int Byte::push_bits(std::string pBits) {
	if( pBits.size() > (unsigned)8-posicion )
		return 8-posicion;

	for( unsigned short i = 0; i<pBits.size(); i++) {
		char aux = pBits.at(pBits.size()-i-1);
		printf("pBits[%d]: %d, %c\n", i, atoi( &aux ), pBits.at(i) );
		bits.set( i+posicion , (bool) atoi( &aux) );
	}

	posicion += pBits.size() - 1;
	if( posicion == 8 )
		lleno = true;
	return 0;
}

bool Byte::pop_bits(std::string &pBits, unsigned short cantidad) {
	if( posicion - cantidad + 1 < 0)
		return false;

	unsigned short pos = posicion;

	pBits.resize(cantidad);

	printf("posicion: %d\n", pos);

	for ( unsigned short i = 0; i < cantidad + 1; i++){
		if( lleno ){
			pos--;
			lleno=false;
		}
		if( bits[i] )
			pBits[pos-i] = '1';
		else
			pBits[pos-i] = '0';
	}

	posicion -= cantidad;

	return true;
}


